
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>


void handler(int signum)
{ 
    std::cout << "get a sig: " << signum << std::endl;
    exit(1);
}


int main()
{
    struct sigaction act, oact;
    act.sa_handler = handler;
    sigemptyset(&act.sa_mask); 
    act.sa_flags = 0;

    sigaction(2, &act, &oact);
    while (true)
    {
        std::cout << "It is a process, pid: " << getpid() << std::endl;
        sleep(1);
    }
    
    return 0;
}








// void PrintPending(sigset_t& pending)
// {
//     std::cout << "curr proc id: [" << getpid() << "], pending: ";
//     for (int signo = 31; signo >= 1; --signo)
//     {
//         if (sigismember(&pending, signo))
//         {
//             std::cout << 1;
//         }
//         else
//         {
//             std::cout << 0;
//         }
//     }
//     std::cout << std::endl;
// }

// int main()
// {
//     // 屏蔽 2 号信号 
//     sigset_t block_set, old_set;
//     sigemptyset(&block_set);
//     sigemptyset(&old_set);
//     sigaddset(&block_set, SIGINT);  // 现在还没有修改内核 block 表 

//     // 修改，设置进入进程的 block 表中 
//     sigprocmask(SIG_BLOCK, &block_set, &old_set); // 完成了对 2 号信号的屏蔽 

//     int cnt = 10;
//     while (true)
//     {
//         // 获取当前进程的 Pending 信号集 
//         sigset_t pending;
//         sigpending(&pending);

//         // 打印 Pending 信号集 
//         PrintPending(pending);

//         // 解除对 2 号信号的屏蔽 
//         --cnt;
//         if (cnt == 0)
//         {
//             std::cout << "解除对 2 号信号的屏蔽..." << std::endl;
//             sigprocmask(SIG_SETMASK, &old_set, &block_set);
//         }

//         sleep(1);
//     }

//     return 0;
// }



// 位图 
// struct bits
// {
//     uint32_t bits[400]; // 400 * 32 
// };

// int main()
// {
//     // sigset_t 就是 Linux 系统提供的用户级数据类型 
//     // 禁止用户直接修改位图 
//     sigset_t bits;
//     return 0;
// }


// //  ./mykill 2 1234 
// int main(int argc, char* argv[])
// {
//     if (argc != 3)
//     {
//         std::cout << "Usage: " << argv[0] << " signum pid" << std::endl;
//         return 1;
//     }
//     pid_t pid = std::stoi(argv[2]);
//     int signum = std::stoi(argv[1]);
//     kill(pid, signum);
//     return 0;
// }


// void hander(int sig)
// {
//     std::cout << "get a sig: " << sig << std::endl;
// }

// int main()
// {
//     // 对信号的自定义捕捉，只需要捕捉一次，后续一直有效 
//     // 一直不产生 2 号信号怎么办？ hander 方法永远不会被执行调用 
//     // 可不可以对更多的信号进行捕捉？ 可以 
//     // 给不同的信号传递同样的 hander 方法，hander 方法的 sig 参数会自动填充为对应信号的宏值（序号） 
//     // 2 号信号 SIGINT 默认动作：终止进程 
//     signal(2, hander); 
//     while (true)
//     {
//         std::cout << "Hello signal! pid: " << getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }
